package cn.good.yan.sf.t5;

/**
 * 5 链表反转   1 2 3 4 5  - 5 4 3 2 1
 *
 * @author shengren.yan
 * @create 2024-06-08
 */
public class ListNode {
    private int value;
    public ListNode next;

    public ListNode(int value, ListNode next) {
        this.value = value;
        this.next = next;
    }

    public void loop() {
        for (ListNode i = this; i != null; i = i.next) {
            System.out.println(i.value);
        }
    }

    // 方法1:  遍历 ---（两个链表，一个遍历，一个新增）
    public ListNode f1(ListNode old) {
        ListNode node = null;
        for (ListNode i = old; i != null; i = i.next) {
            node = new ListNode(i.value, node);
        }
        return node;
    }

    // 方法2: 递归 ---
    public ListNode f2(ListNode old) {
        if (old == null || old.next == null) {
            return old;
        }
        ListNode node = f2(old.next);
        old.next.next = old;
        old.next = null;
        return node;
    }

    // 方法3: 面向过程
    public ListNode f3(ListNode old) {
        // 1 2 3 4 5 --- >
        ListNode node = null;
        while (old != null) {
            ListNode o2 = old.next;  // 永远的第二个节点
            old.next = node;
            node = old;
            old = o2;
        }
        return node;
    }

    public static void main(String[] args) {
        ListNode o5 = new ListNode(5, null);
        ListNode o4 = new ListNode(4, o5);
        ListNode o3 = new ListNode(3, o4);
        ListNode o2 = new ListNode(2, o3);
        ListNode o1 = new ListNode(1, o2);
        o1.loop();
        System.out.println("------------");
//        // 方式1：
//        ListNode r1 = o1.f1(o1);
//        r1.loop();
//        System.out.println(r1);
        // 方式2：
//        ListNode r2 = o1.f2(o1);
//        r2.loop();
        // 方式3"
//        ListNode r3 = o1.f3(o1);
//        r3.loop();
    }

}
